package com.titaniume.java;

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @program: JavaSenior
 * @description:
 *
 * 一：说明
 * java对象正常情况只能比较 == 或 !=
 * 不能使用 > 或 <  但是实际开发中 我们需要对多个对象进行排序 言外之意 就是我们需要
 * 比较对象的大小
 * 如何实现？ 使用两个接口中的任何一个Comarable 或 Comparator
 *
 *
 * 二： Comarable 或 Comparator对比
 * Comarable接口方式 一旦指定 保证Comarable 接口实现类对象在任何位置都能比较大小
 * Comparator属于临时性比较
 *
 *
 * @author: renfei.huang
 * @create: 2021-10-10 18:24
 */
public class CompareTest {

    /*
    * Comparable 接口举例 ：自然排序
    *  1.像String 包装类实现了Comparable接口 重写了compareTo(obj) 方法 给出了比较两个对象大小方式
    *  2.像String 包装类重写了compareTo(obj) 方法以后，进行了从小到大排序
     * 3.重写compareTo(obj) 规则
    *  如果当前对象this大于形参对象obj，则返回正数
    *  如果当前对象this小于形参对象obj，则返回负数
    *  如果当前对象this等于形参对象obj，则返回零
    *
    * 4.对于自定义类如果需要排序 我们可以让自定义类实现Comparable接口 ，重写compareTo() 接口
    * 并在compareTo() 接口中指明如何排序
    * */
    @Test
    public void test1(){

        String[] arr = new String[]{"AA","FF","GG","DD","BB"};
        Arrays.sort(arr);

        System.out.println(Arrays.toString(arr));
    }

    @Test
    public  void test2(){

        Goods [] arr = new Goods[5];

        arr[0]= new Goods("iphone12", 6666);
        arr[1]= new Goods("小米", 2999);
        arr[2]= new Goods("华为", 4399);
        arr[4]= new Goods("微软", 5999);
        arr[3]= new Goods("三星", 5999);

        //直接排序出现下面异常实现Comparable接口 重写compareTo() 方法
        //java.lang.ClassCastException: com.titaniume.java.Goods cannot be cast to java.lang.Comparable
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }





    /*
    * Comparator 定制排序
    * 当前元素类没有实现jav.lang.Comparable接口而又不方便修改代码 或者实现了Comparable接口
    * 但是不适合当前操作 那么可以考虑使用Comparator对象来排序
    *
    * 重写compare(Object o1,Object o2) 方法 ，比较O1和o2 的大小
    * 如果返回正整数 表示 o1大于 o2
    *  返回0 表示o1等于o2
    *   返回负数 表示 o1小于o2
    *
    * */
    @Test
    public void test3(){

        String[] arr = new String[]{"AA","FF","GG","DD","BB"};

        Arrays.sort(arr,new Comparator(){


            //安装字符串从大到小顺序排列
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof  String && o2 instanceof  String){
                    String s1 =(String) o1;
                    String s2 =(String) o2;
                    return -s1.compareTo(s2);
                }
//                return 0;
                throw new RuntimeException("输入的类型不一致");
            }
        });

        System.out.println(Arrays.toString(arr));
    }



    @Test
    public  void test4(){

        Goods [] arr = new Goods[5];

        arr[0]= new Goods("iphone12", 6666);
        arr[1]= new Goods("小米", 2999);
        arr[2]= new Goods("华为", 4399);
        arr[4]= new Goods("微软", 5999);
        arr[3]= new Goods("三星", 5999);


        Arrays.sort(arr, new Comparator<Goods>() {

            //指明商品比较大小排序 在按产品名称从高到低排序
            @Override
            public int compare(Goods o1, Goods o2) {
                if(o1 instanceof  Goods &&  o2 instanceof Goods){
                    Goods g1 = (Goods) o1;
                    Goods g2 = (Goods) o2;
                    if(g1.getName().equals(g2.getName())){
                        return  -Double.compare(g1.getPrice(),g2.getPrice());
                    }else {
                        //默认从低到高
                        return  g1.getName().compareTo(g2.getName());
                    }
                }
                throw  new RuntimeException("输入的数据类型不一致");
            }
        });
        System.out.println(Arrays.toString(arr));
    }
}
